package com.bsj.power.pls.config.net.netty.protocol;

import com.bsj.power.common.def.protocol.uwb.DataUwbInfo;
import com.bsj.power.common.util.Conv;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.List;

/**
 * @author yinhao
 * @version 1.0
 * @description UWB设备数据协议解析类
 * @date 2024/9/23
 */
@Slf4j
public class UWBPacket {

    /**
     * 从数据的开始位置找到所有的正确的完整包，并判断最后未处理的数据是不处理还是全部丢掉
     *
     * @param okList 用于放正确包
     * @param data   从缓冲区读取的数据
     * @return
     */
    public static int packet(List<Object> okList, byte[] data) {
        // 一次可以处理一个包，也可以一次处理多个包（给List多次add）
        int len = data.length;

        // 对长度有最小要求
        // 至少15字节：标识位/开始符（1）+ 信令码（1）+ 长度（1） + 校验位（1）+ 结束位（1）
        final int PACK_MIN_LEN = 5;
        if (len < PACK_MIN_LEN) {
            return 0;
        }
        // 最后未解析数据的索引
        int lastOkIndex = 0;
        int offset = 0;
        while (offset < len) {
            // 找包头
            int posHead = UWBPacketUtil.getPosHead(data, offset);
            if (posHead < 0) {
                //没有包头
                return lastOkIndex;
            }
            //找到包头时后面没有数据了，需要等下一个包合成整包
            if (len - posHead < PACK_MIN_LEN) {
                return lastOkIndex;
            }
            //1个0x24的头
            offset = posHead + 1;
            //1个字节的指令类型
            int cmdType = data[offset++];
            //整包内容长度1字节
            int bodyLen = data[offset++];
            if (bodyLen > 2048) {
                //一包数据实际应该不会超过2k，避免设备程序出错上传了错误的长度数据
                continue;
            }
            //内容长度
            int dataLen = bodyLen - 2;
            //计算包尾的位置大于数据的长度，重新找
            if (dataLen + offset + 2 > len) {
                return lastOkIndex;
            }
            //校验
            if (!UWBPacketUtil.getCheckResult(data, posHead, bodyLen)) {
                offset = offset + dataLen + 2;
            } else {
                //成功
                byte[] array = new byte[bodyLen];
                System.arraycopy(data, posHead, array, 0, bodyLen);
                okList.add(array);
                offset = offset + dataLen + 2;
                lastOkIndex = offset;
            }
        }
        return lastOkIndex;
    }

    public static DataUwbInfo parser(byte[] array) throws IOException {
        if (array == null) {
            log.info("Parser parserData method param null");
            return null;
        }
        //数据长度
        int packet_len = array.length;
        //校验数据，解析包
        if (!UWBPacketUtil.checkPacket(array, 0, packet_len)) {
            return null;
        }
        return null;
    }
}
